package com.hnit.web.Utils;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * SHA加密工具类
 * 支持SHA-1、SHA-256、SHA-384、SHA-512等算法
 */
public class SHAUtils {

    // 算法常量
    public static final String SHA_1 = "SHA-1";
    public static final String SHA_256 = "SHA-256";
    public static final String SHA_384 = "SHA-384";
    public static final String SHA_512 = "SHA-512";

    /**
     * 使用指定SHA算法加密字符串
     * @param data 待加密的数据
     * @param algorithm 加密算法
     * @return 加密后的十六进制字符串
     * @throws NoSuchAlgorithmException 如果算法不被支持
     */
    public static String encrypt(String data, String algorithm) throws NoSuchAlgorithmException {
        if (data == null || algorithm == null) {
            throw new IllegalArgumentException("数据和算法不能为空");
        }

        MessageDigest messageDigest = MessageDigest.getInstance(algorithm);
        byte[] hashBytes = messageDigest.digest(data.getBytes());

        return bytesToHex(hashBytes);
    }

    /**
     * SHA-1加密
     * @param data 待加密的数据
     * @return 加密后的十六进制字符串
     * @throws NoSuchAlgorithmException 如果算法不被支持
     */
    public static String sha1(String data) throws NoSuchAlgorithmException {
        return encrypt(data, SHA_1);
    }

    /**
     * SHA-256加密
     * @param data 待加密的数据
     * @return 加密后的十六进制字符串
     * @throws NoSuchAlgorithmException 如果算法不被支持
     */
    public static String sha256(String data) throws NoSuchAlgorithmException {
        return encrypt(data, SHA_256);
    }

    /**
     * SHA-384加密
     * @param data 待加密的数据
     * @return 加密后的十六进制字符串
     * @throws NoSuchAlgorithmException 如果算法不被支持
     */
    public static String sha384(String data) throws NoSuchAlgorithmException {
        return encrypt(data, SHA_384);
    }

    /**
     * SHA-512加密
     * @param data 待加密的数据
     * @return 加密后的十六进制字符串
     * @throws NoSuchAlgorithmException 如果算法不被支持
     */
    public static String sha512(String data) throws NoSuchAlgorithmException {
        return encrypt(data, SHA_512);
    }

    /**
     * 将字节数组转换为十六进制字符串
     * @param bytes 字节数组
     * @return 十六进制字符串
     */
    private static String bytesToHex(byte[] bytes) {
        StringBuilder hexString = new StringBuilder();
        for (byte b : bytes) {
            String hex = Integer.toHexString(0xFF & b);
            if (hex.length() == 1) {
                hexString.append('0');
            }
            hexString.append(hex);
        }
        return hexString.toString();
    }

    // 测试方法
    public static void main(String[] args) {
        try {
            String testData = "测试SHA加密工具类";

            System.out.println("原始数据: " + testData);
            System.out.println("SHA-1: " + sha1(testData));
            System.out.println("SHA-256: " + sha256(testData));
            System.out.println("SHA-384: " + sha384(testData));
            System.out.println("SHA-512: " + sha512(testData));
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }
}